home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / dskutl / bootcode.asm < prev    next >
Assembly Source File  |  1986-01-28  |  9KB  |  386 lines

  1. To: INFO-IBMPC@usc-isib.ARPA
  2. Subject: Re: BOOTCODE.ASM
  3. Date: Tue, 28 Jan 86 14:38:52 -0500
  4. From: Dan Grim <grim@huey.udel.EDU>
  5.  
  6. I have discovered through my own sad experience that BOOTCODE.ASM is
  7. not able to deal with newer DOS partitions that use the 16-bit FAT
  8. format.  BOOTCODE.ASM understands DOS with 12-bit FAT's (ID byte = 1)
  9. and Xenix (ID byte = 2).  DOS with 16-bit FAT's has an ID byte = 4
  10. which BOOTCODE doesn't recognize.  The fix is trivial: simply change
  11. the line following the label 'lddos' from
  12.  
  13.     mov    al,1            ;id for dos
  14.  
  15. to
  16.  
  17.     mov    al,4            ;id for dos with 16-bit FAT's
  18.  
  19. Of course, once you do that BOOTCODE won't handle 12-bit FAT DOS any
  20. longer.
  21.  
  22.                     Dan
  23.  
  24. ORIGINAL CODE IS AS FOLLOWS:
  25.  
  26.  
  27.     page    60,132
  28.     title    Write prompting boot to hard disk
  29. ;
  30. ;    This program will write a new boot sector to drive C:
  31. ;    that prompts whether you wish to boot xenix
  32. ;    or dos:
  33. ;
  34. ;        X=Xenix, D=Dos
  35. ;
  36. ;    The reply is the one character first initial of the system.
  37. ;
  38. ;    This program is written as a .com file so it should be assembled
  39. ;    and linked, ignoring the missing stack segment message from the linker.
  40. ;    It should then be converted to a com file with exe2bin.
  41. ;
  42. ;
  43. ;    MASM    BOOTCODE,,,;
  44. ;    LINK    BOOTCODE;
  45. ;    EXE2BIN BOOTCODE.EXE BOOTCODE.COM
  46. ;    ERASE    BOOTCODE.EXE
  47. ;
  48. ;    Now the program is ready to run.  It produces a message at the
  49. ;    start telling you what it is going to do, to allow aborting before
  50. ;    touching your hard disk.
  51. ;
  52. ;    The boot only runs on an AT or a pc with Enhanced Graphics Adapter,
  53. ;    since it uses subfunction 19 of the video call, Write String.
  54. ;
  55. ;    Distribution of this program in any way is acceptable to me.
  56. ;
  57. ;        W.D. Cagle   75206,2701
  58. ;
  59. code    segment 'code'
  60.     assume    cs:code,ds:code
  61. video    equ    10h
  62. kbd    equ    16h
  63. diskio    equ    13h
  64. basic    equ    18h
  65. dos    equ    21h
  66. ;
  67. cr    equ    0dh
  68. lf    equ    0ah
  69. base    equ    $
  70. bootloc equ    7c00h
  71. ;
  72.     org    100h
  73. writboot proc    near
  74.     jmp    start            ;jump around constants
  75. bootsec proc    near
  76. bcode    equ    $
  77. adjust    equ    600h-103h        ;stupid adjustment
  78.     cli                ;disable interrupts
  79.     xor    ax,ax            ;clear
  80.     mov    ss,ax            ;place in stack segment
  81.     mov    sp,offset bootloc    ;get my address
  82.     mov    si,sp            ;place in source
  83.     push    ax            ;
  84.     pop    es            ;put in extra segment
  85.     push    ax            ;now for ds
  86.     pop    ds            ;load it
  87.     sti                ;enable interrupts
  88.     cld                ;make move direction positive
  89.     mov    di,600h         ;place to move to
  90.     mov    cx,100h         ;how many words to move
  91.     rep    movsw            ;move it
  92.     mov    ax,offset relboot+adjust ;this gets rid of exe2bin
  93.     push    ax            ;wanting a fixup, cs=0 anyway
  94.     ret
  95. ;
  96. relboot:
  97.     mov    byte ptr p1+adjust,0
  98.     mov    byte ptr p2+adjust,0
  99.     mov    byte ptr p3+adjust,0
  100.     mov    byte ptr p4+adjust,0
  101. wrprmpt:
  102.     mov    si,offset msg4+adjust    ;go ask question
  103.     xor    ch,ch            ;clear
  104.     lodsb                ;get message length
  105.     mov    cl,al            ;to cl
  106.     mov    ax,1301h        ;say write message
  107.     mov    bx,7            ;use normal attribute
  108.     sub    dx,dx            ;row 0 col 0
  109.     mov    bp,si            ;get location of message
  110.     int    video            ;print message
  111.     mov    al,' '                  ;blank out response
  112.     mov    cx,1            ;1 byte
  113.     mov    ah,10            ;say write char only
  114.     int    video            ;do it
  115.     mov    ah,0            ;get keyboard input
  116.     int    kbd
  117.     and    al,7fh-20h        ;make upper case
  118.     push    ax
  119.     mov    ah,10            ;say write char
  120.     mov    cx,1            ;1 byte
  121.     int    video            ;let 'em see what they typed
  122.     pop    ax
  123.     cmp    al,'D'                  ;want dos?
  124.     je    lddos            ;yes
  125.     cmp    al,'X'                  ;want xenix
  126.     je    xenix            ;yes
  127.     jmp    wrprmpt         ;ask again
  128. ;
  129. lddos:
  130.     mov    al,1            ;id for dos
  131.     mov    si,offset dosnm+adjust    ;dos name
  132.     jmp    short gotact1        ;continue
  133. ;
  134. xenix:
  135.     mov    al,2            ;id for xenix
  136.     mov    si,offset xenixnm+adjust ;xenix name
  137. gotact1:
  138.     mov    di,offset msg5nm+adjust ;put name in message
  139.     mov    cx,6            ;length of name
  140.     cld                ;positive direction
  141.     rep    movsb            ;move it
  142.     mov    bl,4            ;max 4 to search
  143.     mov    si,offset parttbl+adjust  ;point to first entry
  144. getpart_a:
  145.     cmp    byte ptr[si+4],al    ;is this the one
  146.     je    gotact2         ;yes
  147.     add    si,16            ;to next
  148.     dec    bl            ;count em
  149.     jnz    getpart_a        ;not end yet
  150.     mov    si,offset msg5+adjust    ;
  151.     xor    ch,ch            ;clear
  152.     lodsb                ;get message length
  153.     mov    cl,al            ;to cl
  154.     mov    ax,1301h        ;say write message
  155.     mov    bx,7            ;use normal attribute
  156.     sub    dx,dx            ;row 0 col 0
  157.     mov    bp,si            ;get location of message
  158.     int    video            ;print message
  159. lupe1:    jmp    lupe1            ;and hang
  160. ;
  161. gotact2:
  162.     mov    byte ptr[si],80h    ;say active
  163.     push    si
  164.     push    bx
  165.     mov    ax,0301h
  166.     mov    bx,600h
  167.     mov    cx,1
  168.     mov    dx,80h
  169.     int    diskio
  170.     pop    bx
  171.     pop    si
  172. ;
  173. gotact:
  174.     mov    dx,[si]         ;drive in dh, head in dl
  175.     mov    cx,[si+2]        ;get track in ch, sector in cl
  176.     mov    bp,si            ;save indicator
  177. ;
  178. ;
  179. finis:
  180.     mov    di,5            ;retry count
  181. rdboot:
  182.     mov    bx,bootloc        ;location for boot
  183.     mov    ax,0201h        ;say read 1 sector
  184.     push    di            ;
  185.     int    diskio            ;go do it
  186. ;
  187.     pop    di            ;
  188.     jnc    goodrd            ;good read
  189. ;
  190.     xor    ax,ax            ;say recalibrate
  191.     int    diskio            ;do it
  192.     dec    di            ;count retries
  193.     jnz    rdboot            ;continue trying
  194.     mov    si,offset msg2+adjust    ;point to bad disk message
  195. wrmsg:
  196.     xor    ch,ch            ;clear
  197.     lodsb                ;get message length
  198.     mov    cl,al            ;to cl
  199.     mov    ax,1301h        ;say write message
  200.     mov    bx,7            ;use normal attribute
  201.     sub    dx,dx            ;row 0 col 0
  202.     mov    bp,si            ;get location of message
  203.     int    video            ;print message
  204. lupe:    jmp    lupe            ;and hang
  205. ;
  206. goodrd:
  207.     mov    si,offset msg3+adjust    ;point to no boot rec msg
  208.     cmp    word ptr bootsig,0aa55h ;see if boot signature
  209.     jne    wrmsg
  210. ;
  211.     mov    si,bp            ;restore partition table pointer
  212.     mov    ax,offset bootloc    ;where partition boot start
  213.     push    ax
  214.     ret
  215. ;
  216. ;
  217. msg2    db    lmsg2,'Error loading operating system'
  218. lmsg2    equ    ($-msg2)-1
  219. msg3    db    lmsg3,'Missing operating system'
  220. lmsg3    equ    ($-msg3)-1
  221. msg4    db    lmsg4,'Enter X=Xenix, D=DOS '
  222. lmsg4    equ    ($-msg4)-1
  223. msg5    db    lmsg5,'Cannot find '
  224. msg5nm    db    'xxxxx'
  225. lmsg5    equ    ($-msg5)-1
  226. dosnm    db    'DOS  '
  227. xenixnm db    'XENIX'
  228. parttbl equ    byte ptr bcode+1beh
  229. p1    equ    bcode+1beh
  230. ;
  231. p2    equ    p1+16
  232. ;
  233. p3    equ    p2+16
  234. ;
  235. p4    equ    p3+16
  236. ;
  237. signat    equ    p4+16
  238. bootsig equ    base+7dfeh
  239.     org    bcode+512
  240. bootsec endp
  241. diskbuf db    512 dup(?)
  242. helloms db    cr,lf
  243.     db    'Bootwriter - This program will read the boot sector',cr,lf
  244.     db    'from disk C: and merge the partition table in with',cr,lf
  245.     db    'the boot program which follows and write it all back',cr,lf
  246.     db    'out to disk C: overlaying what is there.  The resultant',cr,lf
  247.     db    'boot program will prompt for the desired system when',cr,lf
  248.     db    'booting, Xenix or Dos.',cr,lf
  249.     db    cr,lf
  250.     db    'The original boot program will be saved in a file named',cr,lf
  251.     db    'IBMBOOT.SVE in the default directory.',cr,lf
  252.     db    cr,lf
  253.     db    'If you do not wish to do this, you should control-c out',cr,lf
  254.     db    'at the prompt.',cr,lf
  255.     db    'Reply with the enter key to continue, or control-c to stop $'
  256. crlf    db    cr,lf,'$'
  257. ibmboot db    'IBMBOOT.SVE',0
  258. okmsg    db    'Boot sector updated',cr,lf,'$'
  259. ermsg1    db    'Error reading boot sector',cr,lf,'$'
  260. ermsg2    db    'Cannot open save file',cr,lf,'$'
  261. ermsg3    db    'Cannot write save file',cr,lf,'$'
  262. ermsg4    db    'Cannot close save file',cr,lf,'$'
  263. ermsg5    db    'Cannot write boot sector, boot sector creamed',cr,lf,'$'
  264. boothdl dw    0
  265. ;
  266. start:
  267.     mov    dx,offset helloms    ;point to signon message
  268.     mov    ah,9            ;print string
  269.     int    dos            ;say print it
  270. ;
  271. rdcns:    mov    ah,0ch            ;clear kb buffer
  272.     mov    al,1            ;read keyboard input
  273.     int    dos            ;do it
  274.     cmp    al,cr            ;enter key?
  275.     jne    rdcns            ;wait till it is
  276. ;
  277. ;    well, we continue
  278. ;
  279.     mov    dx,offset crlf        ;echo the return
  280.     mov    ah,9
  281.     int    dos            ;write to console
  282. ;
  283.     mov    si,5            ;set up for 5 retries
  284. rddsk:
  285.     push    si            ;save retry counter
  286.     mov    ah,2            ;say read disk
  287.     mov    al,1            ;1 sector
  288.     mov    bx,offset diskbuf    ;point to buffer
  289.     mov    ch,0            ;say cylinder 0
  290.     mov    cl,1            ;say sector 1
  291.     mov    dh,0            ;say track 0
  292.     mov    dl,80h            ;say hard drive 0
  293.     int    diskio            ;do the io
  294.     pop    si
  295.     jnc    rdok            ;good read
  296.     dec    si            ;any more tries?
  297.     jnz    rddsk            ;yes, try again
  298.     mov    dx,offset ermsg1    ;point to trouble message
  299.     mov    ah,9            ;say console write
  300.     int    dos            ;can't read boot sector
  301.     mov    ah,4ch            ;say terminate
  302.     mov    al,1            ;error return code
  303.     int    dos            ;does not return
  304. ;
  305. rdok:
  306.     mov    dx,offset ibmboot    ;get file name
  307.     mov    ah,3ch            ;say create it
  308.     sub    cx,cx            ;zero attribute
  309.     int    dos
  310.     jnc    openok            ;file opened
  311.     mov    dx,offset ermsg2    ;can't open save file
  312.     mov    ah,9
  313.     int    dos            ;tell 'em
  314.     mov    ah,4ch            ;say terminate
  315.     mov    al,2            ;reason
  316.     int    dos            ;
  317. ;
  318. openok:
  319.     mov    boothdl,ax        ;save handle
  320.     mov    bx,ax            ;and put in bx
  321.     mov    ah,40h            ;say write to file
  322.     mov    dx,offset diskbuf    ;get location
  323.     mov    cx,512            ;say 1 sector
  324.     int    dos            ;ask to have it done
  325.     jnc    wrtok            ;good write
  326.     mov    dx,offset ermsg3    ;can't write to save file
  327.     mov    ah,9
  328.     int    dos            ;tell 'em
  329.     mov    ah,4ch            ;say terminate
  330.     mov    al,3            ;reason
  331.     int    dos            ;
  332. ;
  333. wrtok:
  334.     mov    ah,3eh            ;say close file
  335.     mov    bx,boothdl        ;
  336.     int    dos            ;
  337.     jnc    closok            ;closed ok
  338.     mov    dx,offset ermsg4    ;can't close save file
  339.     mov    ah,9
  340.     int    dos            ;tell 'em
  341.     mov    ah,4ch            ;say terminate
  342.     mov    al,4            ;reason
  343.     int    dos            ;
  344. ;
  345. closok:
  346.     push    si
  347.     mov    si,offset diskbuf+1beh    ;start of partition table
  348.     mov    di,offset bootsec+1beh    ;ditto for new sector
  349.     cld                ;make direction positive
  350.     mov    cx,4*16+2        ;how many bytes to move
  351.     rep    movsb            ;move em
  352.     mov    si,5            ;5 retries
  353. wrtboot:
  354.     push    si
  355.     mov    ah,3            ;say write to disk
  356.     mov    al,1            ;say 1 sector
  357.     mov    bx,offset bootsec    ;point to sector to write
  358.     mov    cx,1            ;say sector 1
  359.     mov    dx,80h            ;
  360.     int    diskio            ;do the io
  361.     pop    si
  362.     jnc    updok            ;good write to boot sector
  363.     dec    si            ;count retries
  364.     jnz    wrtboot         ;try again
  365. ;
  366.     mov    dx,offset ermsg5    ;can't write boot sector file
  367.     mov    ah,9
  368.     int    dos            ;tell 'em
  369.     mov    ah,4ch            ;say terminate
  370.     mov    al,5            ;reason
  371.     int    dos            ;
  372. ;
  373. updok:
  374.     mov    dx,offset okmsg     ;say we did it
  375.     mov    ah,9
  376.     int    dos            ;tell 'em
  377.     mov    ah,4ch            ;say terminate
  378.     mov    al,0            ;good return code
  379.     int    dos            ;
  380. writboot endp
  381. ;
  382. ;    new boot code follows
  383. ;
  384. code    ends
  385.     end    writboot
  386.